//创建用户的小仓库
import { defineStore } from 'pinia';
//引入api接口
import { reqLogin, reqUserInfo, reqLogout } from '@/api/acl';
//引入本地持久化存储token方法
import { setToken, getToken, removeToken } from '@/utils/token-utils';
//仓库存储全部路由,因为左侧菜单组件需要这个数组
import { staticRoutes } from '@/router/routes';

//登录接口需要携带的请求体参数-对象--配置参数类型
import type {
	loginData,
	loginResponseData,
	userInfoResponseData,
} from '../api/acl/model/user';
import type { UserInfoState } from './interface/index';

export const useUserInfoStore = defineStore('userInfo', {
	//小仓库储存信息
	state: (): UserInfoState => ({
		token: getToken(), //从本地存储获取token
		name: '', //存储用户名
		avatar: '', //存储用户头像
		menuRoutes: [],
	}),
	//书写小仓库的方法
	actions: {
		/**
		 * @description 登录接口
		 * @author gaopengge
		 * @date 25/02/2023 13:01:54
		 * @param {string} username  携带参数用户名
		 * @param {string} password  携带参数密码
		 */
		async login(username: string, password: string) {
			//登录需要携带的参数
			let data: loginData = { username, password };
			//登录请求
			let result: loginResponseData = await reqLogin(data);
			console.log('登录请求返回:', result);
			//pinia存储token
			this.token = result.token;
			//本地存储token
			setToken(result.token);
		},

		/**
		 * @description 获取用户信息
		 * @author gaopengge
		 * @date 25/02/2023 13:19:32
		 */
		async getInfo() {
			//获取用户信息:请求拦截器携带token公共参数
			let result: userInfoResponseData = await reqUserInfo();
			// console.log('获取用户信息:', result);
			this.name = result.name;
			this.avatar = result.avatar;
			//小仓库存储项目全部路由
			this.menuRoutes = staticRoutes;
		},

		/**
		 * @description  退出登录
		 * @author gaopengge
		 * @date 26/02/2023 00:03:42
		 */
		async reset() {
			//退出登录
			await reqLogout();
			this.token = ''; //清空pinia
			this.name = ''; //清空用户名
			this.avatar = ''; //清空头像
			this.menuRoutes = ''; //清空导航
			//清空本地存储
			removeToken();
		},
	},
});
